﻿#define _CRT_SECURE_NO_WARNINGS

//#include <iostream>
//#include <list>
//using namespace std;
//class Date
//{
//public:
//	Date(size_t y, size_t m, size_t d)
//		: _year(y)
//		, _month(m)
//		, _day(d)
//	{}
//private:
//	size_t _year;
//	size_t _month;
//	size_t _day;
//};
//
//int main()
//{
//	std::list<Date> l;
//	l.push_back(Date{ 2025,8,4 });
//
//	return 0;
//}

//int main()
//{
//	typedef int& l;
//	typedef int&& r;
//	int n = 0;
//	l& r1 = n; // r1 的类型是 int&, 左 + 左 = 左
//	l&& r2 = n; // r2 的类型是 int&, 左 + 右 = 左
//	r& r3 = n; // r3 的类型是 int&, 右 + 左 = 左
//	r&& r4 = 1; // r4 的类型是 int&&, 右 + 右 = 左
//
//	return 0;
//}
//
//template<class T>
//void f1(T& x)
//{}
//template<class T>
//void f2(T&& x)
//{}
//int main()
//{
//	int n = 0;
//
//	// 没有折叠->实例化为void f1(int& x)
//	f1<int>(n);
//	f1<int>(0); // 报错
//
//	// 折叠->实例化为void f1(int& x)
//	f1<int&>(n);
//	f1<int&>(0); // 报错
//
//	// 折叠->实例化为void f1(int& x)
//	f1<int&&>(n);
//	f1<int&&>(0); // 报错
//
//	// 折叠->实例化为void f1(const int& x)
//	f1<const int&>(n);
//	f1<const int&>(0);
//
//	// 折叠->实例化为void f1(const int& x)
//	f1<const int&&>(n);
//	f1<const int&&>(0);
//
//	// 没有折叠->实例化为void f2(int&& x)
//	f2<int>(n); // 报错
//	f2<int>(0);
//
//	// 折叠->实例化为void f2(int& x)
//	f2<int&>(n);
//	f2<int&>(0); // 报错
//
//	// 折叠->实例化为void f2(int&& x)
//	f2<int&&>(n); // 报错
//	f2<int&&>(0);
//
//	return 0;
//}
//
//#include <iostream>
//using namespace std;
//template<class T>
//void Function(T&& t)
//{
//	int a = 0;
//	T x = a;
//	//x++;
//	cout << &a << endl;
//	cout << &x << endl << endl;
//}
//int main()
//{
//	// 10 是右值, 推导出 T = int, 模板实例化为 void Function(int&& t)
//	Function(10); // 右值
//
//	int a;
//	// a 是左值, 推导出 T = int&, 引用折叠, 模板实例化为 void Function(int& t)
//	Function(a); // 左值
//
//	// std::move(a) 是右值, 推导出 T = int, 模板实例化为 void Function(int&& t)
//	Function(std::move(a)); // 右值
//
//	const int b = 8;
//	// a 是左值, 推导出 T = const int&，引用折叠, 模板实例化为 void Function(const int& t)
//	// 所以 Function 内部会编译报错, x 不能++
//	Function(b); // const 左值
//
//	// std::move(b) 右值, 推导出 T = const int, 模板实例化为 void Function(const int&& t)
//	// 所以 Function 内部会编译报错, x 不能++
//	Function(std::move(b)); // const 右值
//	return 0;
//}
//
template<class T>
class BLZ
{
	void fun(T&& t)
	{
		// ...
	}
};



#include <iostream>
using namespace std;

template <class _Ty>
_Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
{ // forward an lvalue as either an lvalue or an rvalue
	return static_cast<_Ty&&>(_Arg);
}


void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
template<class T>
void Function(T&& t)
{
	//Fun(t);
	//Fun(::forward<T>(t));
	Fun(static_cast<decltype(t)&&>(t));
}
int main()
{
	int a;
	const int b = 1;
	Function(a);
	Function(10);
	Function(b);
	Function(std::move(b));
	
	return 0;
}
